﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CdgNetPersistencia.Componentes
{

    /**
    * Autor :  Cristian Daniel Garay Sosa
    * Fecha :  26/03/2012
    * Comentarios:
    *          gestiona los datos de un campo de tabla de base de datos
    * 
    * Cambios:
    *          27/03/2012 - CDGS - Deprecado "cSetterOtd"
    *                              La relacion Prodiedad OTD - Campo de TBL se especifica mediante el Atributo Campo
    *                              en los metodos SETTERS del OTD
    *          27/03/2012 - CDGS - Agregado constructor sin el parametro para "cSetterOtd"
    * 
    * **/

    /// <summary>
    /// Clase que representa al nombre de un campo de tabla
    /// </summary>
    public class CampoTabla
    {

        #region CAMPOS(Fields) DE LA CLASE

        public const string NOMBRE_CLASE = "CampoTabla";

        /// <summary>
        /// Devuelve o establece el nombre del Campo
        /// </summary>
        public string cNombre { get; set; }

        /// <summary>
        /// Devuelve o establece la posicion del campo
        /// </summary>
        public int nIndice { get; set; }

        /// <summary>
        /// Devuelve o establece 
        /// </summary>
        public bool bNulo { get; set; }

        /// <summary>
        /// Devuelve o establece el tipo de dato del campo
        /// </summary>
        public Type tTipo { get; set; }

        /// <summary>
        /// Devuelve o establece si el campo es autogenerado por el SGBD
        /// </summary>
        public bool bAutoGenerado { get; set; }

        /// <summary>
        /// Devuelve o establece la longitud del campo (solo para cadenas)
        /// </summary>
        public int nLargo { get; set; }

        /// <summary>
        /// Nombre del metodo Setter en el OTD
        /// </summary>
        //public string cSetterOtd { get; set; }


        #endregion


        #region CONSTRUCTORES DE LA CLASE

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="cNombreParam">Nombre del campo</param>
        /// <param name="nIndiceParam">Posicion que ocupa entre los demas campos</param>
        public CampoTabla(string cNombreParam, int nIndiceParam)
        {
            cNombre = cNombreParam;
            nIndice = nIndiceParam;
            bNulo = true;

            tTipo = typeof(object);
            bAutoGenerado = false;
        }

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="cNombreParam">Nombre del campo</param>
        /// <param name="nIndiceParam">Posicion que ocupa entre los demas campos</param>
        /// <param name="bNuloParam">Indica si el campo puede o no aceptar valores nulos</param>
        public CampoTabla(string cNombreParam, int nIndiceParam, bool bNuloParam)
        {
            cNombre = cNombreParam;
            nIndice = nIndiceParam;
            bNulo = bNuloParam;

            tTipo = typeof(object);
            bAutoGenerado = false;
        }

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="cNombreParam">Nombre del campo</param>
        /// <param name="nIndiceParam">Posicion que ocupa entre los demas campos</param>
        /// <param name="bNuloParam">Indica si el campo puede o no aceptar valores nulos</param>
        /// /// <param name="tTipoParam">Tipo de datos del atributo</param>
        public CampoTabla(string cNombreParam, int nIndiceParam
                        , bool bNuloParam, Type tTipoParam)
        {
            cNombre = cNombreParam;
            nIndice = nIndiceParam;
            bNulo   = bNuloParam;

            tTipo = tTipoParam;
            bAutoGenerado = false;
        }

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="cNombreParam">Nombre del campo</param>
        /// <param name="nIndiceParam">Posicion que ocupa entre los demas campos</param>
        /// <param name="bNuloParam">Indica si el campo puede o no aceptar valores nulos</param>
        /// <param name="tTipoParam">Tipo de datos del atributo</param>
        /// <param name="bAutoGeneradoParam">Indica si el campo es autogenerado o no por la SGBD</param>
        public CampoTabla(string cNombreParam, int nIndiceParam
                        , bool bNuloParam, Type tTipoParam, bool bAutoGeneradoParam)
        {
            cNombre = cNombreParam;
            nIndice = nIndiceParam;
            bNulo = bNuloParam;

            tTipo = tTipoParam;
            bAutoGenerado = bAutoGeneradoParam;
        }

        /// <summary>
        /// Constructor de clonacion
        /// </summary>
        /// <param name="oCampo">Instancia original a clonar</param>
        public CampoTabla(CampoTabla oCampo)
        {
            cNombre = oCampo.cNombre;
            nIndice = oCampo.nIndice;
            bNulo = oCampo.bNulo;

            tTipo = oCampo.tTipo;
            bAutoGenerado = bAutoGenerado;
        }


        #endregion

        /// <summary>
        /// Devuelve el nombre del campo como nombre de parametro
        /// </summary>
        public string Get_alias
        {
            get
            {
                return "@" + cNombre.Trim().ToLower() + "@";
            }
        }

        /// <summary>
        /// Devuelve la representacion de la instancia
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format("{0} [{1}({2})]", NOMBRE_CLASE, cNombre, tTipo);
        }

    }
}
